

pub fn test_closures_use_param() {
    
    demo1();


    demo2();

    demo3();

    demo4();
}

/**
 * 演示，不可变引用外部参数
 */
fn demo1(){
    let s1 = String::from("s1");

    let s2 = String::from("s2");

    let fn_1 = |s|{
        println!("{s}");
        println!("{s1}");
        println!("{s2}");
    };

    fn_1(String::from("s"));
    fn_1("ceshi".to_owned());
}

/**
 * 可变引用
 */
fn demo2(){
    let mut s1 = String::from("s1");

    let mut s2 = String::from("s2");

    let mut fn_1 = |s|{
        println!("{s}");
        s1.push_str("string11111");
        s2.push_str("string22222");
        println!("{s1}");
        println!("{s2}");

    };

    fn_1(String::from("s"));
    fn_1("ceshi".to_owned());
}


/**
 * 在闭包中，使用 drop 
 */
fn demo3(){
    let s1 = String::from("s1");

    let fn_1 = |s|{
        println!("{s}");
        std::mem::drop(s1);
        // 不能调用
        // println!("{s1}");

    };

    fn_1("s".to_owned());
    // println!("{s1}")
}


/**
 * 在闭包中，使用 move 进行所有权转移
 */
fn demo4(){
    let s1 = String::from("s1");

    let fn_1 = move |s|{
        println!("{s}");
        println!("{s1}");

    };

    fn_1("s".to_owned());
    // 不能调用
    // println!("{s1}")
}